package cn.dapeng.designPatterns.strategy;

import cn.dapeng.designPatterns.strategy.v4.Dog;
import cn.dapeng.designPatterns.strategy.v5.SorterV5;

import java.util.Arrays;

public class TestCase {

    /**
     * 例子一、二：实现的排序单一，如果需要实现其他类型的排序非常不方便
     * 例子三、四：只要排序的类实现Comparable接口， 就可以实现其他类型的类的排序，功能强大很多
     * <p>
     * 以上四个例子比较对象大小的方式都是写死的，如果想更改比较策略就不太方便，顾以上不是策略模式
     * <p>
     * 设计原则：对修改关闭，对扩展开发
     *
     * @param args
     */

    public static void main(String[] args) {
        // 1. 原始的排序
        /*int[] array = {9, 3, 4, 3, 2, 8, 11};
        SorterV1 v1 = new SorterV1();

        v1.sort(array);
        System.out.println(Arrays.toString(array));*/

        // 2. 自定义排序
//        Cat[] cats = new Cat[]{new Cat(1, 3), new Cat(5, 3), new Cat(2, 3), new Cat(2, 3)};
//        SorterV2 v2 = new SorterV2();
//
//        v2.sort(cats);
//        System.out.println(Arrays.toString(cats));

        // 3. 使用jdk的Comparable接口实现
        /*Person[] persons = new Person[]{new Person(44, "a"), new Person(22, "b"), new Person(21, "c")};

        SorterV3 v3 = new SorterV3();
        v3.sort(persons);
        System.out.println(Arrays.toString(persons));*/

        // 4. 使用自定义的比价器实现排序
        Dog[] dogs = new Dog[]{new Dog(99), new Dog(44), new Dog(22)};

        /*SorterV4 v4 = new SorterV4();
        v4.sort(dogs);
        System.out.println(Arrays.toString(dogs));*/

        // 5. 正式的策略模式登场， 比较的策略可定制
        SorterV5<Dog> v5 = new SorterV5<>();
        v5.sort(dogs, ((o1, o2) -> o1.height - o2.height));
        System.out.println(Arrays.toString(dogs));
    }

}
